package org.javahispano.javacup.tacticas_aceptadas.FGR.javacup2009.gallegux.javacup2009.canelaenrama;


import java.awt.Point;
import java.awt.geom.Point2D;
import java.text.DecimalFormat;
import java.util.logging.Handler;
import java.util.logging.Logger;

import org.javahispano.javacup.modelo.Posicion;


public class Util 
{
	
	static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("##.##");

	
	
	public static boolean esta(int[] valores, int valor)
	{
		boolean encontrado = false;
		//
		for (int i = 0; i < valores.length && !encontrado; i++) {
			if (valores[i] == valor) {
				encontrado = true;
			}
		}
		//
		return encontrado;
	}
	
	
	public static boolean estaEn(double valor, double valorMinimo, double valorMaximo)
	{
		return valorMinimo <= valor && valor <= valorMaximo ||
				valorMaximo <= valor && valor <= valorMinimo;
	}
	
	
	/**
	 * 
	 * @param ang
	 * @param angIni
	 * @param angFin
	 * @return
	 */
	public static boolean anguloEstaEn(double ang, double angIni, double angFin)
	{
		if (angIni > angFin) {
			// en este caso el arco entre angIni y angFin pasa por los 360�
			double os = Math.abs(CTE.ANG_360 - angIni);
			angIni = 0; // angIni + os;
			ang += os;
			angFin += os;
		}
		return angIni <= ang && ang <= angFin;
	}
	
	
	public static boolean estaEnCampo(Posicion posicion)
	{
		return estaEnCampo(posicion.getX(), posicion.getY());
	}
	
	
	public static boolean estaEnCampo(double x, double y)
	{
		return estaEn(x, -CTE.MITAD_ANCHO_CAMPO, CTE.MITAD_ANCHO_CAMPO) &&
				estaEn(y, -CTE.MITAD_LARGO_CAMPO, CTE.MITAD_LARGO_CAMPO);
	}
	
	
	public static void removeLoggingHandlers()
	{
		Logger l = Logger.getLogger("");
		
		Handler[] hh = l.getHandlers();
		for (int i = 0; i < hh.length; i++) {
			//System.out.println("handler: " + hh[i]);
			l.removeHandler(hh[i]);
		}
	}
	
	
	public static String toString(int[] array)
	{
		boolean primero = true;
		StringBuilder sb = new StringBuilder("(");
		
		sb.append(array.length);
		sb.append(") {");
		
		for (int i = 0; i < array.length; i++) {
			if (!primero) {
				sb.append(',');
			}
			else {
				primero = false;
			}
			sb.append(array[i]);
		}
		sb.append('}');
		
		return sb.toString();
	}


	
	
	public static Posicion[] cloneArray(Posicion[] array) 
	{
		Posicion[] copia = new Posicion[array.length];
		
		for (int i = 1; i < array.length; i++) {
			copia[i] = new Posicion(array[i]);
		}
		
		return copia;
	}
	
	
	
	
	public static Point toPoint(Posicion pos)
	{
		return new Point((int) pos.getX(), (int) pos.getY());
	}
	
	
	
	public static Point2D.Double rotar(double x, double y, double angulo)
	{
		double anguloRadianes = Math.toRadians(angulo);
		double rx = x * Math.cos(anguloRadianes) - y * Math.sin(anguloRadianes);
		double ry = x * Math.sin(anguloRadianes) + y * Math.cos(anguloRadianes);
		
		return new Point2D.Double(rx, ry);
	}
	
	
	/**
	 * 
	 * @param posRotar posicion a rotar
	 * @param angulo en radianes
	 * @param posOrigen
	 * @return
	 */
	public static Posicion rotar(Posicion posRotar, double angulo, Posicion posOrigen)
	{
		double px = posRotar.getX() - posOrigen.getX();
		double py = posRotar.getY() - posOrigen.getY();
		
		double rx = px * Math.cos(angulo) - py * Math.sin(angulo);
		double ry = px * Math.sin(angulo) + py * Math.cos(angulo);
		
		rx += posOrigen.getX();
		ry += posOrigen.getY();
		
		return new Posicion(rx, ry);
	}
	
	
	
	public static Posicion rotar(Posicion posRotar, double angulo)
	{
		double rx = posRotar.getX() * Math.cos(angulo) - posRotar.getY() * Math.sin(angulo);
		double ry = posRotar.getX() * Math.sin(angulo) + posRotar.getY() * Math.cos(angulo);
		
		return new Posicion(rx, ry);
	}
	
	
	
	public static double normalizarAngulo(double angulo)
	{
		while (!estaEn(angulo, 0, CTE.ANG_360)) {
			if (angulo < 0) angulo += CTE.ANG_360;
			if (angulo >= CTE.ANG_360) angulo -= CTE.ANG_360;
		}
		return angulo;
	}
	
	
	
	public static String toString(Posicion pos)
	{
        return  "( " + toString(pos.getX()) + " , " + toString(pos.getY()) + " )";
	}
	
	
	
	public static String toString(double v)
	{
		return DECIMAL_FORMAT.format(v);
	}
	

	
}
